﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using SaludOcupacional.Exceptions;
using SaludOcupacional.Model;
using System.Collections.ObjectModel;

namespace SaludOcupacional.DataAccess
{
    public class EmpleadoDataAccess : IDisposable
    {
        private DatabaseManager dbManager;

        public void Dispose()
        {
            dbManager.Dispose();
        }
        public EmpleadoDataAccess()
        {
            dbManager = new DatabaseManager();
        }

        public void CreateEmpleado(Empleado empleado)
        {
            if (empleado == null)
            {
                throw new LoginException("Invalid Input Parameters");
            }

            string sqlSentence = "INSERT INTO [dbo].[Empleado]([ci],[codigo],[numero_seguro],[exp],[nombre],[apellido_paterno],[apellido_Materno],[fecha_nacimiento],[telefono],[celular], [estado], [grupo_sangre], [contitucion])VALUES ( ";
            sqlSentence += "@Ci, @Codigo, @numeroSeguro, @Exp, @Nombre, @apellidoPaterno, @apellidoMaterno, @fechaNacimiento, @Telefono, @Celular, @Estado, @grupoSangre, @Constitucion )";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;



            dbManager.Command.Parameters.AddWithValue("@Ci", empleado.Ci);
            dbManager.Command.Parameters.AddWithValue("@Codigo", empleado.Codigo);
            dbManager.Command.Parameters.AddWithValue("@numeroSeguro", empleado.NumeroSeguro);
            dbManager.Command.Parameters.AddWithValue("@Exp", empleado.Exp);
            dbManager.Command.Parameters.AddWithValue("@Nombre", empleado.Nombre);
            dbManager.Command.Parameters.AddWithValue("@apellidoPaterno", empleado.ApellidoPaterno);
            dbManager.Command.Parameters.AddWithValue("@apellidoMaterno", empleado.ApellidoMaterno);
            dbManager.Command.Parameters.AddWithValue("@fechaNacimiento", empleado.FechaNacimiento);
            dbManager.Command.Parameters.AddWithValue("@Telefono", empleado.Telefono);
            dbManager.Command.Parameters.AddWithValue("@Celular", empleado.Celular);
            dbManager.Command.Parameters.AddWithValue("@Estado", empleado.Estado);
            dbManager.Command.Parameters.AddWithValue("@grupoSangre", empleado.GrupoSangre);
            dbManager.Command.Parameters.AddWithValue("@Constitucion", empleado.Constitucion);
            try
            {
                int value = dbManager.NonQuery();

                if (value < 1)
                {
                    throw new LoginException("The record wasn't registered");
                }
            }
            catch (Exception e)
            {
                throw new LoginException("Error creating a user" + e.Message, e);
            }
        }

        public void CrearDatosIngreso(DatosIngreso datosIngreso)
        {
            if (datosIngreso == null)
            {
                throw new LoginException("Invalid Input Parameters");
            }

            string sqlSentence = "INSERT INTO [dbo].[DatosIngreso]([ci_empleado],[puesto_trabajo],[fecha_ingreso],[fecha_traslado],[fecha_salida])VALUES ( ";
            sqlSentence += "@CiEmpleado, @PuestoTrabajo, @FechaIngreso, @FechaTraslado, @FechaSalida )";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;



            dbManager.Command.Parameters.AddWithValue("@CiEmpleado", datosIngreso.CiEmpleado);
            dbManager.Command.Parameters.AddWithValue("@PuestoTrabajo", datosIngreso.PuestoTrabajo);
            dbManager.Command.Parameters.AddWithValue("@FechaIngreso", datosIngreso.FechaIngreso);
            dbManager.Command.Parameters.AddWithValue("@FechaTraslado", datosIngreso.FechaTraslado);
            dbManager.Command.Parameters.AddWithValue("@FechaSalida", datosIngreso.FechaSalida);

            try
            {
                int value = dbManager.NonQuery();

                if (value < 1)
                {
                    throw new LoginException("The record wasn't registered");
                }
            }
            catch (Exception e)
            {
                throw new LoginException("Error creating a user" + e.Message, e);
            }
            
        }

        public Empleado GetEmpleadoByCi(int ci)
        {
            if(ci == 0)
            {
                throw new ArgumentNullException("ci");
            }
            // Create a Sql sentence
            string sqlsentence = "SELECT * FROM [Empleado] WHERE ci = @Ci";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("Ci", ci);

            Empleado resp = null;

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRow reader = dataSet.Tables[0].Rows[0];

                    resp = new Empleado
                    {
                        Ci = Convert.ToInt32(reader["ci"], System.Globalization.CultureInfo.InvariantCulture),
                        CodEmpleado = Convert.ToInt32(reader["cod_empleado"], System.Globalization.CultureInfo.InvariantCulture),
                        Codigo = Convert.ToInt32(reader["codigo"], System.Globalization.CultureInfo.InvariantCulture),
                        NumeroSeguro = Convert.ToInt32(reader["numero_seguro"], System.Globalization.CultureInfo.InvariantCulture),
                        Exp = reader["exp"].ToString(),
                        Nombre = reader["nombre"].ToString(),
                        ApellidoPaterno = reader["apellido_paterno"].ToString(),
                        ApellidoMaterno = reader["apellido_materno"].ToString(),
                        FechaNacimiento = reader["fecha_nacimiento"].ToString(),
                        Telefono = Convert.ToInt32(reader["telefono"], System.Globalization.CultureInfo.InvariantCulture),
                        Celular = Convert.ToInt32(reader["celular"], System.Globalization.CultureInfo.InvariantCulture),
                        
       
                        Estado = reader["estado"].ToString(),
                        GrupoSangre = reader["grupo_sangre"].ToString(),
              
                        Constitucion = reader["contitucion"].ToString()
    
                    };
                }
            }
            catch (Exception)
            {
                throw;
            }

            return resp;

        }

        public void EditEmpleado(Empleado empleado)
        {
            if (empleado == null)
            {
                throw new LoginException("The empleado can´t be null");
            }

            string sqlSentence =
                "UPDATE [Empleado]  SET [ci] = @Ci, [codigo] = @Codigo, [numero_seguro] = @numeroSeguro, [exp] = @Exp, [nombre] = @Nombre, ";
            sqlSentence = sqlSentence + "[apellido_paterno] = @apellidoPaterno, [apellido_materno] = @apellidoMaterno, [fecha_nacimiento] = @fechaNacimiento, ";
            sqlSentence = sqlSentence + "[telefono] = @Telefono, [celular] = @Celular, [estado] = @Estado, [grupo_sangre] = @grupoSangre, ";
            sqlSentence = sqlSentence + "[contitucion] = @Constitucion WHERE [cod_empleado] = @codEmpleado";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;


            dbManager.Command.Parameters.AddWithValue("@Ci", empleado.Ci);
            dbManager.Command.Parameters.AddWithValue("@Codigo", empleado.Codigo);
            dbManager.Command.Parameters.AddWithValue("@numeroSeguro", empleado.NumeroSeguro);
            dbManager.Command.Parameters.AddWithValue("@Exp", empleado.Exp);
            dbManager.Command.Parameters.AddWithValue("@Nombre", empleado.Nombre);
            dbManager.Command.Parameters.AddWithValue("@apellidoPaterno", empleado.ApellidoPaterno);
            dbManager.Command.Parameters.AddWithValue("@apellidoMaterno", empleado.ApellidoMaterno);
            dbManager.Command.Parameters.AddWithValue("@fechaNacimiento", empleado.FechaNacimiento);
            dbManager.Command.Parameters.AddWithValue("@Telefono", empleado.Telefono);
            dbManager.Command.Parameters.AddWithValue("@Celular", empleado.Celular);
            dbManager.Command.Parameters.AddWithValue("@Estado", empleado.Estado);
            dbManager.Command.Parameters.AddWithValue("@grupoSangre", empleado.GrupoSangre);
            dbManager.Command.Parameters.AddWithValue("@Constitucion", empleado.Constitucion);
            dbManager.Command.Parameters.AddWithValue("@codEmpleado", empleado.CodEmpleado);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }
        }

        public void EditarDatos(DatosIngreso datosIngreso)
        {
            if (datosIngreso == null)
            {
                throw new LoginException("The empleado can´t be null");
            }

            string sqlSentence =
               "UPDATE [DatosIngreso]  SET [ci_empleado] = @CiEmpelado, [puesto_trabajo] = @PuestoTrabajo, ";
            sqlSentence = sqlSentence + "[fecha_ingreso] = @FechaIngreso, [fecha_traslado] = @FechaTraslado, [fecha_salida] = @FechaSalida ";
            sqlSentence = sqlSentence + " WHERE [cod_datos] = @codDatos";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;


            dbManager.Command.Parameters.AddWithValue("@CiEmpelado", datosIngreso.CiEmpleado);
            dbManager.Command.Parameters.AddWithValue("@PuestoTrabajo", datosIngreso.PuestoTrabajo);
            dbManager.Command.Parameters.AddWithValue("@FechaIngreso", datosIngreso.FechaIngreso);
            dbManager.Command.Parameters.AddWithValue("@FechaTraslado", datosIngreso.FechaTraslado);
            dbManager.Command.Parameters.AddWithValue("@FechaSalida", datosIngreso.FechaSalida);
            dbManager.Command.Parameters.AddWithValue("@codDatos", datosIngreso.CodDatos);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }
            
        }

        public void CambiarEstadoEmpleado(int ci, string nuevoEstado)
        {
            if (ci == 0)
            {
                throw new ArgumentNullException("ci");
            }

            string sqlSentence = "UPDATE [Empleado]  SET [estado] = @Estado WHERE [ci] = @Ci";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;

            dbManager.Command.Parameters.AddWithValue("@Estado", nuevoEstado);
            dbManager.Command.Parameters.AddWithValue("@Ci", ci);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }
        }

        public DatosIngreso GetDatosIngresoByCi(int ci)
        {
            if(ci == 0)
            {
                throw new ArgumentNullException("ci");
            }
            // Create a Sql sentence
            string sqlsentence = "SELECT * FROM [DatosIngreso] WHERE ci_empleado = @Ci";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("Ci", ci);

            DatosIngreso resp = null;

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRow reader = dataSet.Tables[0].Rows[0];

                    resp = new DatosIngreso
                    {
                        CiEmpleado= Convert.ToInt32(reader["ci_empleado"], System.Globalization.CultureInfo.InvariantCulture),
                        PuestoTrabajo = reader["puesto_trabajo"].ToString(),
                        FechaIngreso = reader["fecha_ingreso"].ToString(),
                        FechaTraslado = reader["fecha_traslado"].ToString(),
                        FechaSalida = reader["fecha_salida"].ToString(),
                        CodDatos = Convert.ToInt32(reader["cod_datos"])

    
                    };
                }
            }


            catch (Exception)
            {
                throw;
            }

            return resp;

        }

        public Collection<Empleado> BuscarEmpleadoPorNombre(string nombre)
        {
            

            string espa = " ";

            string sqlsentence = "SELECT DISTINCT * FROM [Empleado] WHERE ([nombre]+@espa+[apellido_paterno]+@espa+[apellido_materno] LIKE '%' + @Nombre + '%')";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("@espa", espa);
            dbManager.Command.Parameters.AddWithValue("@Nombre", nombre);

            Collection<Empleado> empleados = new Collection<Empleado>();

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRowCollection reader = dataSet.Tables[0].Rows;

                    for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                    {

                        empleados.Add(new Empleado
                                         {
                                             Ci = Convert.ToInt32(reader[i]["ci"], System.Globalization.CultureInfo.InvariantCulture),
                        CodEmpleado = Convert.ToInt32(reader[i]["cod_empleado"], System.Globalization.CultureInfo.InvariantCulture),
                        Codigo = Convert.ToInt32(reader[i]["codigo"], System.Globalization.CultureInfo.InvariantCulture),
                        NumeroSeguro = Convert.ToInt32(reader[i]["numero_seguro"], System.Globalization.CultureInfo.InvariantCulture),
                        Exp = reader[i]["exp"].ToString(),
                        Nombre = reader[i]["nombre"].ToString(),
                        ApellidoPaterno = reader[i]["apellido_paterno"].ToString(),
                        ApellidoMaterno = reader[i]["apellido_materno"].ToString(),
                        FechaNacimiento = reader[i]["fecha_nacimiento"].ToString(),
                        Telefono = Convert.ToInt32(reader[i]["telefono"], System.Globalization.CultureInfo.InvariantCulture),
                        Celular = Convert.ToInt32(reader[i]["celular"], System.Globalization.CultureInfo.InvariantCulture),
                        
       
                        Estado = reader[i]["estado"].ToString(),
                        GrupoSangre = reader[i]["grupo_sangre"].ToString(),
              
                        Constitucion = reader[i]["contitucion"].ToString()


                                         });
                    }
                }
            }


            catch (Exception)
            {
                throw;
            }

            return empleados;

        }

        public Collection<Empleado> TodosLosEmpleados()
        {




            string sqlsentence = "SELECT * FROM [Empleado]";

            dbManager.Command.CommandText = sqlsentence;


            Collection<Empleado> empleados = new Collection<Empleado>();

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRowCollection reader = dataSet.Tables[0].Rows;

                    for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                    {

                        empleados.Add(new Empleado
                        {
                            Ci = Convert.ToInt32(reader[i]["ci"], System.Globalization.CultureInfo.InvariantCulture),
                            CodEmpleado = Convert.ToInt32(reader[i]["cod_empleado"], System.Globalization.CultureInfo.InvariantCulture),
                            Codigo = Convert.ToInt32(reader[i]["codigo"], System.Globalization.CultureInfo.InvariantCulture),
                            NumeroSeguro = Convert.ToInt32(reader[i]["numero_seguro"], System.Globalization.CultureInfo.InvariantCulture),
                            Exp = reader[i]["exp"].ToString(),
                            Nombre = reader[i]["nombre"].ToString(),
                            ApellidoPaterno = reader[i]["apellido_paterno"].ToString(),
                            ApellidoMaterno = reader[i]["apellido_materno"].ToString(),
                            FechaNacimiento = reader[i]["fecha_nacimiento"].ToString(),
                            Telefono = Convert.ToInt32(reader[i]["telefono"], System.Globalization.CultureInfo.InvariantCulture),
                            Celular = Convert.ToInt32(reader[i]["celular"], System.Globalization.CultureInfo.InvariantCulture),


                            Estado = reader[i]["estado"].ToString(),
                            GrupoSangre = reader[i]["grupo_sangre"].ToString(),

                            Constitucion = reader[i]["contitucion"].ToString()


                        });
                    }
                }
            }


            catch (Exception)
            {
                throw;
            }

            return empleados;

        }

        

    }
}
